home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
pcr
/
pcr4_4.lha
/
DIST
/
threads
/
MkPCRSwap.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-10
|
5KB
|
195 lines
/*
* MkPCRSwap.c
*
* Demers, December 10, 1990 9:03:12 am PST
*
* Make PCR swap directories
*/
#include "xr/BasicTypes.h"
#include "xr/Errno.h"
#include "xr/ThreadsSharedMemBSDUtils.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define FAIL_IF_NOT_ISVTX 0
char *pgmName = "(bad pgm name)";
bool verboseArg = FALSE;
char *swapArg = DEFAULT_SWAP_DIR;
int nswapArg = 1;
int nthreadsArg = 80;
void
Fail(fmt, x, y)
char *fmt;
int x, y;
{
if( fmt != NIL ) {
printf("ERROR: ");
printf(fmt, x, y);
printf("\n");
}
printf("Usage: %s [-v] [-swap dirname] [-nswap n] [-nthreads n]\n",
pgmName);
fflush(stdout);
exit(1);
}
void
ParseArgs(argc, argv)
int argc;
char **argv;
{
int argno;
char *arg;
pgmName = argv[0];
argno = 1;
while( argno < argc ) {
arg = argv[argno];
if( strcmp(arg,"-v") == 0 ) {
verboseArg = TRUE;
argno++;
continue;
}
if( strcmp(arg, "-swap") == 0 ) {
if( (++argno) >= argc ) Fail("missing swap dir name", 0, 0);
swapArg = argv[argno];
argno++;
continue;
}
if( strcmp(arg, "-nswap") == 0 ) {
if( (++argno) >= argc ) Fail("missing swap dir count", 0, 0);
nswapArg = atoi(argv[argno]);
if( nswapArg <= 0 ) Fail("bad swap dir count %s", argv[argno], 0);
argno++;
continue;
}
if( strcmp(arg, "-nthreads") == 0 ) {
if( (++argno) >= argc ) Fail("missing threads count", 0, 0);
nthreadsArg = atoi(argv[argno]);
if( nthreadsArg <= 0 ) Fail("bad threads count %s", argv[argno], 0);
argno++;
continue;
}
if( (strcmp(arg, "-usage") == 0)
|| (strcmp(arg, "-help") == 0)
|| (strcmp(arg, "-?") == 0) ) {
Fail(NIL, 0, 0);
}
if( arg[0] == '-' ) {
Fail("bad flag: %s", arg, 0);
}
Fail("bad arg: %s", arg, 0);
}
}
char *
EnsureDir(name)
{
int ans;
struct stat statBuf;
if( verboseArg ) {
printf("Creating directory %s ... ", name); fflush(stdout);
}
ans = stat(name, &statBuf);
if( ans >= 0 ) {
if( !S_ISDIR(statBuf.st_mode))
return "not a directory";
if( (statBuf.st_mode & 0777) != 0777 ) {
ans = chmod(name, 0777);
if( ans < 0 )
return "no permission in directory";
}
} else {
ans = mkdir(name, 0777);
if( ans < 0 )
return "cannot create directory";
}
if( verboseArg ) {
printf("ok\n"); fflush(stdout);
}
return NIL;
}
char *
EnsureStickyFile(shortName, index)
char *shortName;
int index;
{
char *msg;
int ans;
int fd;
char fnBuf[FILE_NAME_BUF_SIZE];
ans = XR_SharedMemBSDMkFileName(fnBuf, (sizeof fnBuf), shortName, index);
if( ans < 0 ) return "bad file name (too long?)";
if( verboseArg ) {
printf("Creating file %s ... ", fnBuf); fflush(stdout);
}
ans = XR_SharedMemBSDGetBackingFile(shortName, index, 0, &fd);
if( ans < 0 ) return "can't create file";
(void) close(fd);
# if FAIL_IF_NOT_ISVTX
if( ans > 0 ) return "can't make file sticky";
# else
if( (ans > 0) && verboseArg ) {
printf("(can't make file sticky) ... ");
}
# endif
if( verboseArg ) {
printf("ok\n"); fflush(stdout);
}
return NIL;
}
main(argc, argv)
int argc;
char **argv;
{
int ans, i, j;
char *msg;
char fnBuf[FILE_NAME_BUF_SIZE];
ParseArgs(argc, argv);
umask(0); /* so file create modes work */
ans = XR_SharedMemBSDSetSwapDir(swapArg, DI_NONE);
if( ans != 0 ) Fail("Bad swapdir name", 0, 0);
msg = EnsureDir(swapArg);
if( msg != NIL ) Fail("%s: %s", swapArg, msg);
for( i = 0; i < nswapArg; i++ ) {
(void)XR_SharedMemBSDSetSwapDir(NIL, i);
ans = XR_SharedMemBSDMkFileName(fnBuf, (sizeof fnBuf), NIL, FI_NONE);
if( ans < 0 ) Fail("Bad swap subdir name %d", i, 0);
msg = EnsureDir(fnBuf);
if( msg != NIL ) Fail("%s: %s", fnBuf, msg);
msg = EnsureStickyFile(FN_DATA, FI_NONE);
if( msg != NIL ) Fail("%s: %s", FN_DATA, msg);
msg = EnsureStickyFile(FN_HEAP, FI_NONE);
if( msg != NIL ) Fail("%s: %s", FN_HEAP, msg);
for( j = 0; j < nthreadsArg; j++ ) {
msg = EnsureStickyFile(FN_STACK, j);
if( msg != NIL ) Fail("%s: %s", fnBuf, msg);
}
}
exit(0);
}